// 给你一份『词汇表』（字符串数组） words 和一张『字母表』（字符串） chars。

// 假如你可以用 chars 中的『字母』（字符）拼写出 words 中的某个『单词』（字符串），那么我们就认为你掌握了这个单词。

// 注意：每次拼写（指拼写词汇表中的一个单词）时，chars 中的每个字母都只能用一次。

// 返回词汇表 words 中你掌握的所有单词的 长度之和。

//  

// 示例 1：

// 输入：words = ["cat","bt","hat","tree"], chars = "atach"
// 输出：6
// 解释： 
// 可以形成字符串 "cat" 和 "hat"，所以答案是 3 + 3 = 6。
// 示例 2：

// 输入：words = ["hello","world","leetcode"], chars = "welldonehoneyr"
// 输出：10
// 解释：
// 可以形成字符串 "hello" 和 "world"，所以答案是 5 + 5 = 10。
//  

// 提示：

// 1 <= words.length <= 1000
// 1 <= words[i].length, chars.length <= 100
// 所有字符串中都仅包含小写英文字母

#include <vector>
#include <string>
#include <unordered_map>

using namespace std;

/* 哈希表
时间复杂度：O(n)
空间复杂度：O(S) S是字符集大小
*/
class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {
        unordered_map<char, int> dict{};
        for (const auto& c : chars) {
            ++dict[c];
        }
        int res{0};
        for (const auto& word : words) {
            auto dict1{dict};
            bool flag{true};
            for (const auto& c : word) {
                if (dict1[c] == 0) {
                    flag = false;
                    break;
                }
                --dict1[c];
            }
            if (flag) {
                res += static_cast<int>(word.size());
            }
        }
        return res;
    }
};